<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  
  <meta name="generator" content="Hugo 0.98.0" />

  
  <meta name="description" content="走在通往幸福的路上">
  

  
  <link rel="apple-touch-icon" sizes="180x180" href="https://blog.v5u.win/apple-touch-icon.png">

  
  <link rel="icon" type="image/png" sizes="32x32" href="https://blog.v5u.win/favicon-32x32.png">

  
  <link rel="icon" type="image/png" sizes="16x16" href="https://blog.v5u.win/favicon-16x16.png">

  
  <link rel="manifest" href="https://blog.v5u.win/site.webmanifest">

  
  <link rel="mask-icon" href="https://blog.v5u.win/safari-pinned-tab.svg" color="">

  <meta name="msapplication-TileColor" content="">

  <meta name="theme-color" content="">

  
  <link rel="stylesheet" href="https://blog.v5u.win/css/bootstrap.min.css" />

  
  <title>swift 关键字篇 | 为吾优</title>
  

  <style>
body {
  min-width: 300px;
}

.custom-navbar {
  margin-bottom: 1em;
  height: 60px;
}

.custom-navbar a {
  display: inline-block; 
  padding: 18px 0;
  margin-right: 1em; 
  font-weight: bold; 
}

.custom-navbar a:hover,
.custom-navbar a:focus {
  text-decoration: none; 
}

@media print {
  .custom-navbar {
    display: none;
  }
}

article {
  padding-bottom: 1em;
}

img {
  max-width: 100%;
}


body {
  background-color: #fff;
}



body {
  color: #212529;
}



a {
  color: #007bff;
}



a:hover,
a:focus {
  color: #0056b3;
}



.custom-navbar {
  background-color: #212529;
}



.custom-navbar a {
  color: rgba(255,255,255,.75);
}



.custom-navbar a:hover,
.custom-navbar a:focus {
  color: rgba(255,255,255,1);
}



.container {
  max-width: 800px;
}





</style>
</head>

<body>
  <nav class="custom-navbar">
  <div class="container">
    
    <a href="/">文章</a>
    
    <a href="/tags/">标签</a>
    
    <a href="/about/">关于</a>
    
    <a href="/index.xml">RSS</a>
    
  </div>
</nav>
  
  <div class="container">
    <article>
      <h1>swift 关键字篇</h1>
<p>@noescape：no escape(没有逃脱)</p>
<p>用来修饰闭包，含义为非逃逸闭包。</p>
<p>当闭包作为参数传递进函数时，如果这个闭包只在函数中被使用，则开发者可以将这个闭包声明成非逃逸的，即告诉系统当此函数结束后，这个闭包的生命周期也将结束，这样做的好处是可以提高代码性能，将闭包声明成非逃逸的类型使用@noescape关键字。</p>
<p>(1) 默认，swift 3.0 弃用，函数结束后，这个闭包的生命周期也将结束。</p>
<p>(2) 在其内部如果需要使用self这个关键字，self可以被省略。</p>
<p>@escaping 逃逸闭包</p>
<p>逃逸的闭包常用于异步的操作，这类函数会在异步操作开始之后立刻返回，但是闭包直到异步操作结束后才会被调用。例如这个闭包是异步处理一个网络请求，只有当请求结束后，闭包的生命周期才结束。当闭包作为函数的参数传入时，很有可能这个闭包在函数返回之后才会被执行。</p>
<p>@autoclosure 自动闭包</p>
<p>(1)默认非逃逸</p>
<p>(2)闭包也可以被自动的生成，这种闭包被称为自动闭包，自动闭包自动将表达式封装成闭包。</p>
<p>(3)自动闭包不接收任何参数，被调用时会返回被包装在其中的表达式的值。</p>
<p>(4)当闭包作为函数参数时，可以将参数标记 @autoclosure 来接收自动闭包。</p>
<p>(5)自动闭包能够延迟求值,因为代码段不会被执行直到你调用这个闭包。</p>
<p>(6)自动闭包默认是非逃逸的，如果要使用逃逸的闭包，需要手动声明: @autoclosure @escaping 旧版本：@autoclosure(escaping)</p>
<p>//(a)自动闭包演示</p>
<p>var students = [“A”,”B”,”C”]</p>
<p>let studentsProvider = { students.remove(at: 0) } //自动闭包自动将表达式封装成闭包</p>
<p>studentsProvider()//(b)自动闭包演示</p>
<p>var list = [1,2,3,4,5,6]</p>
<p>//创建一个显式闭包</p>
<p>let closures = {</p>
<p>list.append(7)</p>
<p>}</p>
<p>print(list)//将打印[1,2,3,4,5,6]</p>
<p>closures()</p>
<p>print(list)//引用传递，将打印[1,2,3,4,5,6,7]</p>
<p>func func1(closure: ()-&gt;Void) -&gt; Void {</p>
<p>//执行显式的闭包</p>
<p>closures()</p>
<p>}</p>
<p>func func2(auto: @autoclosure ()-&gt;Void) -&gt; Void {</p>
<p>//执行自动闭包</p>
<p>auto()</p>
<p>}</p>
<p>//显式闭包</p>
<p>func1(closure: closures)</p>
<p>print(list) //将打印[1,2,3,4,5,6,7,7]</p>
<p>//将表达式自动生成闭包</p>
<p>func2(auto: list.append(8))</p>
<p>print(list)//将打印[1,2,3,4,5,6,7,7,8]</p>

    </article>
  </div>

  
  
  

  
</body>

</html>